﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public enum Npcinfo
    {
        Task,
        Shop,
        Iron
    }
    abstract class Fashernpc
    {
        private string name;
        private Npcinfo type;
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }
        public Npcinfo Type
        {
            get { return this.type; }
            set { this.type = value; }
        }

        public Fashernpc() { }

        public Fashernpc(string name, Npcinfo type)
        {
            this.name = name;
            this.type = type;
        }

        public abstract void Speak();
    }
    class ShopNPC : Fashernpc
    {
        private string item;
        private string name;
        public string Item { get => item; set => item = value; }
        public override void Speak()
        {
            Console.WriteLine("我这里有大宝贝要不要过来看看\tNPC：{0}，我这里有{1}商品，你要吗？", base.Name, this.item);
           
        }

        public ShopNPC(string name, Npcinfo type, string item) : base(name, type)
        {
            this.item = item;
        }
    }
    class TaskNPC : Fashernpc
    {
        private string taskInfo;

        public string TaskInfo
        {
            get { return this.taskInfo; }
            set { this.taskInfo = value; }
        }

        public TaskNPC(string name, Npcinfo type, string taskInfo) : base(name, type)
        {
            this.taskInfo = taskInfo;
        }

        public override void Speak()
        {
            Console.WriteLine("你能帮帮我吗？\tNPC：{0}，任务：{1}", this.Name, this.taskInfo);
        }
    }
    class IronNPC : Fashernpc
    {
        private string ironInfo;

        public string IronInfo
        {
            get { return this.ironInfo; }
            set { this.ironInfo = value; }
        }

        public IronNPC(string name, Npcinfo type, string ironInfo) : base(name, type)
        {
            this.ironInfo = ironInfo;
        }

        public override void Speak()
        {
            Console.WriteLine("碰到了偷学大师！\t偷学大师：陈小旭\t请选择是否偷学：1.是，偷学实现弯道超车！ 2.否，继续探路！");
            int a = int.Parse(Console.ReadLine());
            switch (a)
            {
                case 1:
                    Console.WriteLine("明智的选择！请继续选择加强：1.修补偷学装备2.强化偷学宝典3.打造人生赢家大保剑");
                    int b = int.Parse(Console.ReadLine());
                    switch (b)
                    {
                        case 1:
                            Console.WriteLine("缝缝补补又一年，何不打造一把武器呢？\tNPC：{0}，铁匠：{1}", this.Name, this.ironInfo);
                            break;
                        case 2:
                            Console.WriteLine("加强一下总不会亏的，小伙子！\tNPC：{0}，铁匠：{1}", this.Name, this.ironInfo);
                            break;
                        case 3:
                            Console.WriteLine("芜湖，恭喜你小伙子！你获得了传奇武器：大保剑！\tNPC：{0}，铁匠：{1}", this.Name, this.ironInfo);
                            break;
                        default:
                            break;
                    }
                    break;
                case 2:
                    Console.WriteLine("正在冒险！");
                    break;
                default:
                    break;
            }
            
            
        }
    }
    //在游戏中会出现很多种不同用途的 NPC，这些 NPC 有各自的存在的价值和作用，
    //同时又具备一些共性的东西。
    //在开发 NPC 系统的时候，往往是需要提取共性，独立出一个父类，
    //然后子类继承实现不同作用的 NPC。
    //分析：任务 NPC，商贩 NPC，铁匠 NPC，三种 NPC 的种类。
    //共有属性：npc 的名字，npc 的类型；
    //共有方法：都能和玩家交互(交谈)；

    class Program
    {
        static void Main(string[] args)
        {
            TaskNPC npc1 = new TaskNPC("小白兔", Npcinfo.Task, "去野外帮我挖2根萝卜。");
            npc1.Speak();

            ShopNPC npc2 = new ShopNPC("灰太狼", Npcinfo.Shop, "懒羊羊");
            npc2.Speak();
            IronNPC npc3 = new IronNPC("陈小旭",Npcinfo.Iron,"加强装备中！");
            npc3.Speak();

            Console.ReadKey();
        }
    }
}
